Software performance depends on allocated resources. For instance, when software runs in a computer system, whether it is a centralized or a distributed system, the software performance depends on how much of computing resources is being allocated. Computer resources may include physical resources as well as virtual resources. Examples of physical resources, e.g., may include a processor (central processing unit (CPU) or CPU cycles), memory, internal Input/Output (disk I/O) and external I/O (networking bandwidth). Examples of virtual resources may include thread pool size, buffer size and others.
Existing approaches that try to understand a component's performance may require experts with deep understanding on the software structure, i.e., how to break the software into individual components, and how the end-to-end performance is derived from the component-level performance. Such approaches may also require adding instrumenting code to the software source code which may be difficult in many situations. Further such approaches may be highly software-specific, and cannot be easily generalized.
Another known approach may intercept the targeted software. The drawback of this approach lies in the difficulty for designing the intercept. It also requires the knowledge of the APIs for all the low-level resource usage that the software is calling, which presents a difficult practice. In addition, the large overhead created by such monitoring layer or intercept may significantly affect the software performance such that the collected performance numbers are not representative. Other approaches may passively collect observed data for performance related information, but with such approaches the effectiveness may highly depend on the observed data only.